import java.io.*;
import java.net.*;

/**
* Modulo que contiene la l�gica de aplicaci�n de un Cliente que se conecta a
* un Servidor Concurrente que utiliza una clase de envoltura de Socket que contiene
* m�todos para mandar y recibir mensajes.
* @bibliography: Computacion Distribuida. M. L. Lio. Pearson-Addison Wesley. pp 154-156.
* @author: M. L. Liu
*/
public class cliente_dinamico {
  private int iniport; // Puerto de conexi�n
  private int nomcliente; // Nombre del cliente
  private String host; // M�quina donde est� al servidor concurrente
  private SocketBytes Socket; // Socket de comunicaci�n con hilo de servidor concurrente

  // constructor
  cliente_dinamico(int iniport_in, int nom_in, String host_in) {
    iniport = iniport_in;
    nomcliente = nom_in;
    host = host_in;
  } // cliente_dinamico

  // OJO ESPECIFICO DE CADA PROBLEMA
  private void ejecutar() throws Exception{
    boolean acabar = false;
    String dato;
    int dato_int;

    InputStreamReader is = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(is);

    while (acabar == false) {
      System.out.println("Introduzca Entero a comunicar a servidor: ");
      dato = br.readLine();
      Socket.enviaMensaje(new Integer(dato));
      dato_int = (new Integer(dato)).intValue();
      if (dato_int == 0)
        acabar = true;

      /*
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) { return; }
      */
    } // while
    Socket.enviaMensaje(new Integer(0));
    // Socket.close();
  } // ejecutar

  public void run() {
    try {
      // Abrimos conexion con puerto iniport
      Socket = new SocketBytes(host, iniport);
      System.out.println(nomcliente + ": abierto conexion con socket " + iniport);

      // Enviamos entero con nombre de cliente a conectar
      Socket.enviaMensaje(new Integer(nomcliente));

      ejecutar();
    } catch (Exception e) // Imprimir cualquier excepci�n
    { System.err.println(e); }
  } // run

  public static void main(String args[]) throws NumberFormatException {
    if (args.length != 3) {
      System.out.println("Necesito 3 argumentos: Host, Puerto inicial, Nombre Cliente");
      System.exit(1);
    } // if ...  

    int iniport = Integer.parseInt(args[1]);
    int nomcliente = Integer.parseInt(args[2]);
    System.out.println(nomcliente + ":Puerto Inicial = " + iniport);

    cliente_dinamico cd = new cliente_dinamico(iniport, nomcliente, args[0]);
    cd.run();
  } // main
} // cliente_dinamico
